package com.heihei.imgpreview;

import com.heihei.util.CollectionUtilF;
import com.heihei.util.FileUtilF;
import com.heihei.util.StrUtilF;

import java.io.File;
import java.io.IOException;
import java.util.*;

/**
 *  创建预览（创建html文件，以便于在浏览器中观看）
 *
 * @version 1.0
 * @since JDK1.8
 * @author duanhengfei
 * @date 2021年01月29日 16:50:07
 */
public class GeneratePreviewHtml {
    public static void main(String[] args) throws IOException {
        //开启交互式 html预览生成
        startGeneratePreviewHtmlExe();
    }

    public static void startGeneratePreviewHtmlExe() throws IOException {
        System.out.println("请输入目标文件夹");
        File filePath = FileUtilF.getValidSrcDir();
        System.out.println(">> 1 创建预览（拷贝） 30张");
        System.out.println(">> 2 创建预览（拷贝） 60张");
        System.out.println(">> 3 创建预览 所有");
        System.out.println(">> 4 创建预览 20张");
        System.out.println(">> 5 创建预览 30张");
        System.out.println(">> 6 创建预览 60张");
        System.out.println(">> 7 创建预览 自指定");
        Scanner sc = new Scanner(System.in);
        int i = sc.nextInt();
        if(i == 1) {
            createSeveralPreview(filePath, 30);
        } else if(i == 2) {
            createSeveralPreview(filePath, 60);
        } else if (i == 3) {
            createAllPreview(filePath, -1);
        } else if (i == 4) {
            createAllPreview(filePath, 20);
        } else if (i == 5) {
            createAllPreview(filePath, 30);
        } else if (i == 6) {
            createAllPreview(filePath, 60);
        } else if (i == 7) {
            //自己指定
            System.out.println(">>请输入要预览的图片张数：");
            createAllPreview(filePath, sc.nextInt());
        } else {
            System.out.println("指令非法");
        }
    }

    /**
     * 核心方法 -- 生成html预览
     * count控制随机抽取的图片数量；  传入-1，表示抽取所有；
     *
     * @param filePath
     * @param count
     * @Return
     * @throws
     * @author duanhengfei
     * @date 2021年01月31日 13:34:42
     */
    public static void createAllPreview(File filePath, int count) throws IOException {
        //所有图片资源
        List<String> allImgListPre = FileUtilF.readAllImgRelativePath(filePath);
        List<String> allImgList = null;
        if(count == -1) {
            allImgList = allImgListPre;
        } else {
            allImgList = CollectionUtilF.selectRandomElementFromList(allImgListPre, count);
        }
        //处理url
        List urlList = new ArrayList();
        for (String s : allImgList) {
            urlList.add(s.substring(1));
        }
        //html文件名
        File targetFile = getHtmlFile(filePath);
        String imgStr = StrUtilF.jointStr2ArrayStr4Js(urlList).replaceAll("\\\\", "/");
        String htmlStr = readAndReplace(imgStr);
        boolean flag = FileUtilF.writeTxtFile(htmlStr, targetFile);
        if (flag) {
            System.out.println("OK");
        } else {
            System.out.println("有点儿问题，请检查配置");
        }
    }

    /**
     * 创建指定张图片的预览信息（向上走一级，复制出来指定张图片，创建预览）
     * @param filePath 父级文件夹路径
     * @param imgCount 要创建预览的图片张数
     */
    private static void createSeveralPreview(File filePath, int imgCount) throws IOException {
        //所有图片资源
        List<String> allImgList = FileUtilF.readAllImgRelativePath(filePath);
        //父级文件夹
        File parentFile = filePath.getParentFile();
        //在上一级，创建preview_dir文件夹
        File previewDir = new File(parentFile, "preview_dir");
        if(!previewDir.exists()) {
            previewDir.mkdirs();
        }
        //html文件名
        File targetFile = getHtmlFile(parentFile);
        //随机从List中，抽取30张图片，复制入preview_dir中
        List<String> previewImgList = CollectionUtilF.selectRandomElementFromList(allImgList, imgCount);
        //获取img的url集合
        List<String> urlList = new ArrayList<>();
        //把抽取出来的这30张图片，复制到preview_dir文件夹内（比照原路径）
        for (String img : previewImgList) {
            File desFile = new File(previewDir, img);
            if(!desFile.getParentFile().exists()) {
                desFile.getParentFile().mkdirs();
            }
            FileUtilF.copyFile(new File(filePath, img), desFile);
            urlList.add("preview_dir" + img);
        }

        String imgStr = StrUtilF.jointStr2ArrayStr4Js(urlList).replaceAll("\\\\", "/");
        String htmlStr = readAndReplace(imgStr);
        boolean flag = FileUtilF.writeTxtFile(htmlStr, targetFile);
        if (flag) {
            System.out.println("OK");
        } else {
            System.out.println("有点儿问题，请检查配置");
        }
    }

    private static File getHtmlFile(File parentFile) {
        File targetFile = new File(parentFile, "___" + "preview" + "___.html");
        if(!targetFile.exists()) {
            return targetFile;
        }
        int index = 0;
        while(targetFile.exists()) {
            targetFile = new File(parentFile, "___" + "preview" + index + "___.html");
            index++;
        }
        return targetFile;
    }

    public static String readAndReplace(String imgData) throws IOException {
        //读取 imgHtml模板文件 时，优先先读与jar包同级的模板文件，
        //如果jar包同级目录中，没有 templateConfig.html 模板文件，就从资源文件中读取
        File imgHtmlOriginalFile = null;
        File file = new File(".","templateConfig.html");
        if(file.exists()) {
            imgHtmlOriginalFile = file;
        } else {
            imgHtmlOriginalFile = new File(GeneratePreviewHtml.class.getClassLoader().getResource("templateConfig.html").getPath());
        }
        return FileUtilF.readTxtFile(imgHtmlOriginalFile).replace("$$$$$$$", imgData);
    }

}
